package cn.hacynn.nd.common.utils;

import cn.hacynn.nd.common.constant.MessageConstant;
import cn.hacynn.nd.common.context.BaseContext;
import cn.hacynn.nd.common.exception.UserException;
import cn.hacynn.nd.common.properties.JwtProperties;
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
 * @Author Hacynn
 * @Date 2024/6/2 16:19
 * @Version 1.0
 */
@AllArgsConstructor
@Slf4j
public class CommonUtil {

    private JwtProperties jwtProperties;

    /**
     * 从请求中获取用户id并存入BaseContext中
     * @param request
     */
    public void getBaseContext(HttpServletRequest request) {

        //从请求中获取象中获取所有的 cookies。
        // 浏览器会在每个HTTP请求中发送与该域相关的所有cookies，
        // 因此request.getCookies()可能返回一个包含多个Cookie对象的数组
        Cookie[] cookies = request.getCookies();
        String token = null;
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                //cookies中的name等于COOKIE-TOKEN" 的 cookie，提取它的值赋给 token 变量。
                if ("COOKIE-TOKEN".equals(cookie.getName())) {
                    //提取该 cookie 的值（即 JWT 令牌）。
                    //将cookie和token同时存储起来方便使用
                    token = cookie.getValue();
                }
            }
        }
        //2. 校验令牌
        try {
            log.info("从请求头中获得jwt令牌: {}", token);
            //解析 JWT 令牌，并返回解析后的声明（claims）
            Claims claims = JwtUtil.parseJWT(jwtProperties.getUserSecretKey(), token);
            //从claim中获取当前用户id这个唯一变量
            Long id = Long.valueOf(claims.get("id").toString());
            log.info("当前用户id: {}", id);
            // 存入BaseContext中供全线程使用
            BaseContext.setCurrentId(id);
        } catch (Exception ex) {
            // 用户未登录
            throw new UserException(MessageConstant.USER_NOT_LOGIN);
        }
    }
}
